package com.njtech.pet.service.impl;

import com.njtech.pet.constant.Constant;
import com.njtech.pet.dao.FriendDao;
import com.njtech.pet.entity.Friend;
import com.njtech.pet.entity.User;
import com.njtech.pet.service.FriendService;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * Author:helloboy
 * Date:2020-03-22 19:26
 * Description:<描述>
 */
@Service
@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public class FriendServiceImpl implements FriendService {
    @Autowired
    FriendDao friendDao;
    /**
     * 插入一条数据
     * @param row 新纪录
     * @return 修改行数
     */
    @Override
    public int insert(Friend row){
        return  friendDao.insert(row);
    }

    /**
     * 修改一条数据
     * @param row 新纪录
     * @return 修改行数
     */
    @Override
    public int updateByFriendId(Friend row){
        return friendDao.updateByFriendId(row);
    }

    /**
     * 查找某一用户的好友
     * @param user 用户
     * @param state Friend类的状态【用于区分查找好友请求与所有好友】
     * @param beginDate 起日期 可NULL
     * @param endDate 起日期 可NULL
     * @param orderState 用于描述排序的语句，如u.username asc
     * @return 用户集合
     */
    @Override
    public List<Friend> selectByUser(@Param("user") User user, @Param("state") String state, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("orderState") String orderState){
        return friendDao.selectByUser(user,state,beginDate,endDate,orderState);
    }
    /**
     * 查找某一用户的好友
     * @param friend 用户位置的用户
     * @param state Friend类的状态【用于区分查找好友请求与所有好友】
     * @param beginDate 起日期 可NULL
     * @param endDate 起日期 可NULL
     * @param orderState 用于描述排序的语句，如u.username asc
     * @return 用户集合
     */
    @Override
    public List<Friend> selectByFriend(@Param("friend")User friend,
                                @Param("state")String state,
                                @Param("beginDate")String beginDate,
                                @Param("endDate")String endDate,
                                @Param("orderState")String orderState){
        return friendDao.selectByFriend(friend,state,beginDate,endDate,orderState);
    }

    /**
     * select by friend id
     * @param id friend id
     * @return result
     */
    @Override
    public Friend selectByFriendId(@Param("id") Integer id){
        return friendDao.selectByFriendId(id);
    }

    /***********************************
     * 判断有没有A--->B的指定双向数据
     * @param uid   用户id
     * @param fid   用户id
     * @return      提示信息
     * ------------------------------成功！
     */
    @Override
    public String sendRequest(Integer uid, Integer fid) {
        //设置A、B用户
        User user_A = new User();
        user_A.setId(uid);
        User user_B = new User();
        user_B.setId(fid);
        //获得A--->B的指定状态数据集
        List<Friend>list = friendDao.selectByUidAndFidAndState(uid,fid,Constant.Friend.STATE_ACCEPTED.getValue());
        if(list.size()>0){
            list.clear();
            return "你们已经是好友";
        }
        list = friendDao.selectByUidAndFidAndState(uid,fid,Constant.Friend.STATE_SENT.getValue());
        if(list.size()>0){
            list.clear();
            return "已向用户发送过好友请求";
        }
        list = friendDao.selectByUidAndFidAndState(fid,uid,Constant.Friend.STATE_SENT.getValue());
        if(list.size()>0){
            list.clear();
            return "对方已请求";
        }
        Friend friend = new Friend(null, user_A, user_B, Constant.Friend.STATE_SENT.getValue(), null, null);
        int flag = friendDao.insert(friend);
        if(flag==0){
            return "发送好友请求失败";
        }
        return "发送好友请求成功";
    }
    /*******************************
     * 同意好友请求:修改+新增
     * @param friendId  好友关系id
     * @param fid      执行操作用户id
     * @return        提示信息
     * -----------------------成功
     */
    @Override
    public String acceptFriend(Integer friendId,Integer fid){
        //找到这条friend关系数据
        Friend friend = friendDao.selectByFriendId(friendId);
        Integer uid = friend.getUser().getId();
        //设置用户
        User user_A=new User();
        user_A.setId(uid);
        User user_B=new User();
        user_B.setId(fid);
        //修改A--->B的状态为已同意
        Friend friend1 = new Friend();
        friend1.setId(friendId);
        friend1.setState(Constant.Friend.STATE_ACCEPTED.getValue());
        friendDao.updateByFriendId(friend1);
        //新增一条反向数据
        Friend friend2 = new Friend(null, user_B, user_A, Constant.Friend.STATE_ACCEPTED.getValue(), null, null);
        int flag = friendDao.insert(friend2);
        if(flag==0){
            return "添加好友失败";
        }
        return "添加好友成功";
    }
    /**********************************
     * 删除好友请求，修改两条状态
     * @param friendId  好友关系id
     * @param uid      执行操作的A用户
     * @return          提示信息
     * ------------------------------成功
     */
    @Override
    public String deleteFriend(Integer friendId,Integer uid){
        //找到这条friend关系数据
        Friend friend = friendDao.selectByFriendId(friendId);
        Integer fid = friend.getFriend().getId();

        Friend friend1 = new Friend();
        friend1.setId(friendId);
        friend1.setState(Constant.Friend.STATE_DELETED.getValue());
        int flag01 = friendDao.updateByFriendId(friend1);

        //找B--->A状态为已同意
        List<Friend> list = friendDao.selectByUidAndFidAndState(fid,uid,Constant.Friend.STATE_ACCEPTED.getValue());

        Friend friend2 = list.get(0);
        friend2.setState(Constant.Friend.STATE_DELETED.getValue());
        int flag02=friendDao.updateByFriendId(friend2);

        if(flag01==0||flag02==0){
            return "删除好友失败";
        }
        return "删除好友成功";
    }

    /**
     * 查询当前用户发出的状态未已拒绝*
     * 查询其他到当前用户状态为已发送
     * @param uid  当前操作用户id
     * @return
     */
    @Override
    public List<Friend> findTip(Integer uid){
        User user = new User();
        user.setId(uid);
        List<Friend> friendList01 = friendDao.selectByUser(user,Constant.Friend.STATE_REJECTED_UNREAD.getValue(),null,null,"friendName asc");
        List<Friend> friendList02 =friendDao.selectByFriend(user,Constant.Friend.STATE_SENT.getValue(),null,null,"userName asc");
        friendList02.addAll(friendList01);
        return friendList02;
    }
}
